#ifndef PROCESS_H
#define PROCESS_H

#include <stdint.h>
#include <stddef.h>

// 进程状态枚举
typedef enum {
    PROC_UNUSED = 0,    // 未使用
    PROC_EMBRYO,        // 正在创建
    PROC_SLEEPING,      // 睡眠中
    PROC_RUNNABLE,      // 就绪态
    PROC_RUNNING,       // 运行态
    PROC_ZOMBIE         // 僵尸态(已终止,等待父进程回收)
} proc_state_t;

// 进程控制块(PCB)结构
typedef struct proc {
    int pid;                    // 进程ID
    proc_state_t state;         // 进程状态
    char name[32];              // 进程名称
    void (*entry)(void);        // 入口函数
    void* stack;                // 内核栈指针
    uint64_t context;           // 上下文(寄存器保存区)
    
    struct proc* parent;        // 父进程指针
    int exit_status;            // 退出状态码
    
    uint64_t create_time;       // 创建时间
    uint64_t run_time;          // 运行时间(累计)
    uint32_t time_slice;        // 时间片(ms)
    uint32_t elapsed_time;      // 已消耗时间
    
    struct proc* next;          // 链表指针
} proc_t;

// 进程表配置
#define MAX_PROC 64             // 最大进程数
#define STACK_SIZE 4096         // 内核栈大小(4KB)

// ===== 核心接口 =====

/**
 * 初始化进程管理系统
 */
void process_init(void);

/**
 * 分配进程结构
 * @return 进程指针,失败返回NULL
 */
proc_t* alloc_process(void);

/**
 * 释放进程资源
 * @param p 进程指针
 */
void free_process(proc_t* p);

/**
 * 创建新进程
 * @param entry 进程入口函数
 * @return 进程PID,失败返回-1
 */
int create_process(void (*entry)(void));

/**
 * 终止当前进程
 * @param status 退出状态码
 */
void exit_process(int status);

/**
 * 等待子进程结束
 * @param status 用于接收子进程退出状态的指针
 * @return 子进程PID,失败返回-1
 */
int wait_process(int* status);

/**
 * 获取当前进程
 * @return 当前进程指针
 */
proc_t* get_current_process(void);

/**
 * 进程调度
 */
void schedule_process(void);

/**
 * 打印所有进程状态
 */
void print_processes(void);

#endif // PROCESS_H

